/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pio.action.administrador.resultados;

/**
 *
 * @author linda
 */
import jxl.*;
import DBMS.DataBaseManager;
import clases.ArchivoExcel;
import clases.Aspirante;
import clases.Institucion;
import clases.PeriodoInscripcion;
import clases.Preinscrito;
import clases.ResultadoPrueba;
import clases.ResultadoSeccionPrueba;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.upload.FormFile;

import org.apache.struts.actions.DispatchAction;


/**
 *
 * @author charles
 */
public class VerificarExcel extends DispatchAction {

    /* forward name="success" path="" */
    private static final String SUCCESS = "success";
    private static final String FAILURE = "failure";

    public ActionForward cargar(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
        throws Exception {
        int f=1,c=0;                
        String file="";
        ArchivoExcel uploadForm = (ArchivoExcel) form;
        int agregados=0, modificados=0, existentes=0;
        String mensaje2="";
        int paso=0;
    try {
        file=getPath(uploadForm);
        mensaje2=file;
        //file="/home/linda/Desktop/Docs PIO/PruebasXls/ADMISIÓN_PIO.xls";
        //file=(String)request.getAttribute("pathfile");
        Workbook workbook = Workbook.getWorkbook(new File(file)); 
        /*Se asume que se lee solo una sheet 1/1 (Hoja 0)*/
        Sheet sheet = workbook.getSheet(0); 
        while (f< sheet.getRows())
        {
            /*Se cargan las celdas */
            Cell ci= sheet.getCell(c,f);
            String cedula1=verfCi(uploadForm, ci); 
            Preinscrito p = new Preinscrito();
            p.setCedula(cedula1);
            /*Se identifica al Preinscrito*/
            //Se asocian datos a nuevo preinscrito
            Cell lastName= sheet.getCell(c+1,f);
            Cell name= sheet.getCell(c+2,f);
            
            String name1=verfCellString(uploadForm,name);
            String lastName1=verfCellString(uploadForm,lastName);
            /*Se consigue id de institucion*/
            Cell institution= sheet.getCell(c+3,f);
            String institution1=verfCellString(uploadForm,institution);
            Institucion i=new Institucion();
            i.setNombre(institution1);
            /*Institucion debe existir porque fue verificada en el action verific*/
            DataBaseManager dbms = DataBaseManager.getInstance();
            ArrayList instituciones= dbms.consultarInstitucion(i);
            i=(Institucion)instituciones.get(0);        
            //Se consulta al preinscrito por cedula
            ArrayList PreAux= dbms.consultarPreinscritos(p);
            //Se setea el estatus del preinscrito
            Cell status= sheet.getCell(c+4,f);
            String status1=verfCellString(uploadForm,status).toLowerCase();
            if(status1.equals("seleccionado")) 
            { paso=25;
                p.setNotaPio(1);}
            else{
                p.setNotaPio(0);}
            p.setNombres(name1);
            p.setApellidos(lastName1);
            p.setInstitucionId(i.getId());
        if(PreAux.isEmpty()){
            
           while (!dbms.agregarPreinscrito(p))
            {
                Aspirante a = new Aspirante();
                a.setCedula(p.getCedula());
                a.setNombres(p.getNombres());
                a.setApellidos(p.getApellidos());
                a.setInstitucionId(p.getInstitucionId());
                a.setPromedio(1.0);
                if(!dbms.agregarAspirante(a)){
                
                uploadForm.setMensaje(name1+lastName1+"fff"+p.getCedula()+paso+p.getApellidos()+p.getNombres()+p.getInstitucionId()+"Error: Agregacion "
                        + "Preinscrito como Aspirante cedula: "+cedula1+ " fila: "
                        +(f+1)+" columna: "+(c+1));
                request.setAttribute("completado",null);
                return mapping.findForward(FAILURE);
                }
            } 
            agregados++;
        }else{
        existentes++;
        }
           
        
        
        /*Si existe el preinscrito, datos de fecha y notas si son actualizados*/
        
            /*Se setean notas*/
            Cell notaMatematica= sheet.getCell(c+5,f);
            Cell notaVerbal= sheet.getCell(c+6,f);
            Cell notaRaven= sheet.getCell(c+7,f);
            int notaMatematica1=verfNumbLabel(uploadForm,notaMatematica);
            int notaVerbal1=verfNumbLabel(uploadForm,notaVerbal);
            int notaRaven1=verfNumbLabel(uploadForm,notaRaven);
            if(((notaVerbal1==-2 || notaMatematica1==-2 || notaRaven1==-2) ||
                   ( notaVerbal1==-1 || notaMatematica1==-1 || notaRaven1==-1) )&&
                    !( notaVerbal1==-2 && notaMatematica1==-2 && notaRaven1==-2)
                   )
            {
                        uploadForm.setMensaje("Error en fila"
                + " "+(f+1)+" columna "+(c+8)+" Nota Verbal: "+notaVerbal1+
                    " Nota Matematica: "+notaMatematica1+" Nota Raven: "+notaRaven1);
                return mapping.findForward(FAILURE);
            
            }
            
            if ((notaVerbal1!=-2 && notaMatematica1!=-2 && notaRaven1!=-2) &&
                    (notaVerbal1!=-1 && notaMatematica1!=-1 && notaRaven1!=-1)){
            /*Prueba PIO*/
            ResultadoPrueba pioPrueba=new ResultadoPrueba();
            pioPrueba.setCedula(cedula1);
            pioPrueba.setNombrePrueba("Pio");
            //Consultar 
            ArrayList rpPio =dbms.consultarResultadoPrueba(pioPrueba);
            if(rpPio.isEmpty()){     
                pioPrueba.setNotaTotal(notaVerbal1+notaMatematica1);
                if (!dbms.agregarResultadoPrueba(pioPrueba))
                {
                    uploadForm.setMensaje("Error en resultado Prueba PIO "
                            + "cedula: "+cedula1);
                    request.setAttribute("completado",null);
                    return mapping.findForward(FAILURE);
                }
            rpPio =dbms.consultarResultadoPrueba(pioPrueba);
            pioPrueba=(ResultadoPrueba)rpPio.get(0);
            }else{
                pioPrueba=(ResultadoPrueba)rpPio.get(0);
                pioPrueba.setNotaTotal(notaVerbal1+notaMatematica1);
               if(!dbms.modificarResultadoPrueba(pioPrueba)){
                    uploadForm.setMensaje("Error en resultado Prueba PIO al modificar"
                        + "cedula: "+cedula1+"CI:"
                        +pioPrueba.getCedula()+"NombrePrueba : "
                        +pioPrueba.getNombrePrueba()+"ID : "+pioPrueba.getId()) ;
                    request.setAttribute("completado",null);
                    return mapping.findForward(FAILURE);
               }
            }
            
            /* Prueba PIO existe,se obtiene para 
             * tomar el id y setearlo en secciones*/
            /*Seccion Verbal*/
            ResultadoSeccionPrueba hvSeccion= new ResultadoSeccionPrueba();
            hvSeccion.setNombreSeccion("Habilidad Verbal");
            hvSeccion.setIdPrueba(pioPrueba.getId());
            ArrayList hvSeccionP =dbms.consultarResultadoSeccionPrueba(hvSeccion);
            hvSeccion.setNotaParcial(notaVerbal1);
            if(hvSeccionP.isEmpty()){
                if(!dbms.agregarResultadoSeccionPrueba(hvSeccion)){
                    uploadForm.setMensaje("Error en resultado Seccion Prueba "
                            + "Verbal PIO cedula: "+cedula1);
                    request.setAttribute("completado",null);
                    return mapping.findForward(FAILURE);
                }
            }else{
            if(!dbms.modificarResultadoSeccionPrueba(hvSeccion)){
                    uploadForm.setMensaje("Error en resultado Seccion Prueba "
                            + "PIO al modificar hab verbal "
                        +"NombreSeccionPrueba : "
                        +hvSeccion.getNombreSeccion()
                        +"ID : "+hvSeccion.getIdPrueba()) ;
                    request.setAttribute("completado",null);
                    return mapping.findForward(FAILURE);
               }
            }
            /*Seccion MATe*/
            ResultadoSeccionPrueba hmSeccion= new ResultadoSeccionPrueba();
            hmSeccion.setNombreSeccion("Habilidad Matematica");
            hmSeccion.setIdPrueba(pioPrueba.getId());
            ArrayList hmSeccionP =dbms.consultarResultadoSeccionPrueba(hmSeccion);
            hmSeccion.setNotaParcial(notaMatematica1);
            if(hmSeccionP.isEmpty()){
                if(!dbms.agregarResultadoSeccionPrueba(hmSeccion)){
                    uploadForm.setMensaje("Error en resultado Seccion Prueba "
                            + "Matematica PIO cedula: "+cedula1);
                    request.setAttribute("completado",null);
                    return mapping.findForward(FAILURE);
                }
            }else{
            if(!dbms.modificarResultadoSeccionPrueba(hmSeccion)){
                    uploadForm.setMensaje("Error en resultado Seccion Prueba "
                            + "PIO al modificar hab mat "
                        +"NombreSeccionPrueba : "
                        +hmSeccion.getNombreSeccion()
                        +"ID : "+hmSeccion.getIdPrueba()) ;
                    request.setAttribute("completado",null);
                    return mapping.findForward(FAILURE);
               }
            }
            /* Prueba Raven,se obtiene para 
             * tomar el id y setearlo su seccion Raven*/
            /*Prueba PIO*/
            ResultadoPrueba ravenPrueba=new ResultadoPrueba();
            ravenPrueba.setCedula(cedula1);
            ravenPrueba.setNombrePrueba("Raven");
            //Consultar 
            ArrayList rpRaven =dbms.consultarResultadoPrueba(ravenPrueba);
            if(rpRaven.isEmpty()){     
               ravenPrueba.setNotaTotal(notaRaven1);
                if (!dbms.agregarResultadoPrueba(ravenPrueba))
                {
                    uploadForm.setMensaje("Error en resultado Prueba Raven "
                            + "cedula: "+cedula1);
                    request.setAttribute("completado",null);
                    return mapping.findForward(FAILURE);
                }
            rpRaven =dbms.consultarResultadoPrueba(ravenPrueba);
            ravenPrueba=(ResultadoPrueba)rpRaven.get(0);
            }else{
                ravenPrueba=(ResultadoPrueba)rpRaven.get(0);
                ravenPrueba.setNotaTotal(notaRaven1);
               if(!dbms.modificarResultadoPrueba(ravenPrueba)){
                    uploadForm.setMensaje("Error en resultado Prueba PIO al modificar"
                        + "cedula: "+cedula1+"CI:"
                        +ravenPrueba.getCedula()+"NombrePrueba : "
                        +ravenPrueba.getNombrePrueba()+"ID : "+ravenPrueba.getId()) ;
                    request.setAttribute("completado",null);
                    return mapping.findForward(FAILURE);
               }
            }
            
            p.setNotaRaven(notaRaven1);
            /* Prueba Raven existe,se obtiene para 
             * tomar el id y setearlo en secciones*/
            
            
            ResultadoSeccionPrueba rvnSeccion= new ResultadoSeccionPrueba();
            rvnSeccion.setNombreSeccion("Raven");
            rvnSeccion.setIdPrueba(ravenPrueba.getId());
            ArrayList rvnSeccionP =dbms.consultarResultadoSeccionPrueba(rvnSeccion);
            rvnSeccion.setNotaParcial(notaRaven1);
            if(rvnSeccionP.isEmpty()){
                if(!dbms.agregarResultadoSeccionPrueba(rvnSeccion)){
                    uploadForm.setMensaje("Error en resultado Seccion Prueba "
                            + "Raven cedula:"+cedula1);
                    request.setAttribute("completado",null);
                return mapping.findForward(FAILURE);
                }
            }else{
                    
                if(!dbms.modificarResultadoSeccionPrueba(rvnSeccion)){
                    uploadForm.setMensaje("Error en resultado Seccion Prueba "
                            + "Raven al modificar  "
                        +"NombreSeccionPrueba : "
                        +rvnSeccion.getNombreSeccion()
                        +"ID : "+rvnSeccion.getIdPrueba()) ;
                    request.setAttribute("completado",null);
                    return mapping.findForward(FAILURE);
               }
                    
            }
            
            }
            if(status1.equals("seleccionado")){
                
                Cell fechaInscripcion= sheet.getCell(c+8,f);
                Cell hora= sheet.getCell(c+9,f);
                Cell lugar= sheet.getCell(c+10,f);
                Cell sede= sheet.getCell(c+11,f);
                String fechaInscripcion1= verfCellDate(uploadForm,fechaInscripcion);    
                String hora1=verfCellString(uploadForm,hora);
                String lugar1=verfCellString(uploadForm,lugar);
                String sede1=verfCellString(uploadForm,sede);
                
                
             if((fechaInscripcion1.equals("vacio") ||  lugar1.equals("vacio") ||
                     sede1.equals("vacio")  || hora1.equals("vacio") || 
                     fechaInscripcion1.equals("error") ||  lugar1.equals("error")
                     || sede1.equals("error")  || hora1.equals("error") ) && 
                     !( fechaInscripcion1.equals("vacio") && 
                     lugar1.equals("vacio") && sede1.equals("vacio") &&
                     hora1.equals("vacio"))){
                    uploadForm.setMensaje("Error en fila"+ " "+(f+1)
                            +" columna "+(c+8)+" Fecha Inscr: "
                            +fechaInscripcion1+" Hora: "+hora1
                            +" lugar: "+lugar1+" sede: "+sede1);
                    return mapping.findForward(FAILURE);
             }
             
                PeriodoInscripcion pInscrip= new PeriodoInscripcion();
                pInscrip.setFecha(fechaInscripcion1);
                pInscrip.setHora(hora1);
                pInscrip.setLugar(lugar1);
                pInscrip.setSede(sede1);
                /* ES NECESARIO METODO MODIFICAR*/
                ArrayList Periodos=dbms.consultarPeriodoInscripcion(pInscrip);
                if(Periodos.isEmpty()){
                    if (!dbms.agregarPeriodoInscripcion(pInscrip)){
                        uploadForm.setMensaje("Error Agregacion "
                                + "Periodo de Inscripcion cedula: "+cedula1);
                        request.setAttribute("completado",null);
                        return mapping.findForward(FAILURE);
                    }
                    Periodos=dbms.consultarPeriodoInscripcion(pInscrip);
                }
                pInscrip=(PeriodoInscripcion)Periodos.get(0);
                p.setIdInscripcion(pInscrip.getId());
            }else{
            
            p.setIdInscripcion(null);
            }
            //ELIMinar Fecha de inscripcion si ya no es seleccionado
                
      
            if (!dbms.modificarPreinscrito(p))
            {
                uploadForm.setMensaje(
                        "id: "+p.getId()
                        +"inscr: "+p.getIdInscripcion()
                        +"NPIO: "+p.getNotaPio()
                        +"NRAv: "+p.getNotaRaven()
                        +"Prom: "+p.getPromedio()
                        +"Error Modificacion "
                        + " Preinscrito :"+cedula1);
                request.setAttribute("completado",null);
                return mapping.findForward(FAILURE);
            }    
            modificados++;
         
        f++;
        
        }
        uploadForm.setMensaje("Carga Exitosa <BR> Agregados: "+
                agregados+" Actualizados : "+modificados);
        request.setAttribute("completado","completado"+mensaje2);
        return mapping.findForward(SUCCESS);
        }catch (Exception e) {
            String mensaje = "Error: Archivo no soportado o Formato dentro "
                    + "de archivo Excel invalido";
            uploadForm.setMensaje(mensaje+e+file);
            request.setAttribute("completado",null);
            return mapping.findForward(FAILURE);
            
    }
    }
   
     public ActionForward verificar(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
         ArchivoExcel uploadForm = (ArchivoExcel) form;
         int paso=0;//QUITAR
         String mensaje;
         boolean esSeleccionado=false; //Refiere s  al estatus 
         String file="";
         String stringa1 = null;
         String cedula1 = "";
         int numTotRows=0;
         int numTotCols=0;
         int c=0,f=1;//fila=1 debido al titulo de las columnas 
         
    try {
        if (!uploadForm.getPath().getFileName().isEmpty()) {    
            file=getPath(uploadForm);
            uploadForm.setMensaje("");
            Workbook workbook = Workbook.getWorkbook(new File(file)); 
            //Se asume que se lee solo una sheet 1/1 (Hoja 0)
            Sheet sheet = workbook.getSheet(0); //Solo hoja 0
            numTotRows=sheet.getRows();
            numTotCols=sheet.getColumns(); 
            if(numTotCols == 0 || numTotRows < 2) 
            {
                uploadForm.setMensaje("Error archivo vacio");
                return mapping.findForward(FAILURE);
                //Error return
            }   
            
            while (f< sheet.getRows())
            {
            //Se cargan las celdas 
            Cell ci= sheet.getCell(c,f);
            cedula1=verfCi(uploadForm, ci);
            
            
            if (cedula1.equals("error")){
                uploadForm.setMensaje("Error en fila "+(f+1)+" columna "+(c+1)
                                +" verifique el campo cedula, recuerde que no"
                                + " debe estar vacio"+sheet.getRows());
                return mapping.findForward(FAILURE);
            }
            
            Cell lastName= sheet.getCell(c+1,f);
            String lastname1=verfCellString(uploadForm,lastName);
            if (lastname1.equals("error")){
                uploadForm.setMensaje("Error en fila "+(f+1)+" columna "+(c+2)
                +" verifique el campo, recuerde que no debe estar vacio");
                return mapping.findForward(FAILURE);       
            }
            
            Cell name= sheet.getCell(c+2,f);  
            String name1=verfCellString(uploadForm,name);
            if (name1.equals("error")){
                uploadForm.setMensaje("Error en fila "+(f+1)+" columna "+(c+3)
                +" verifique el campo, recuerde que no debe estar vacio");
                return mapping.findForward(FAILURE);       
            }
            
            Cell institution= sheet.getCell(c+3,f); 
            String institution1=verfCellString(uploadForm,institution);
            if (institution1.equals("error")){
                uploadForm.setMensaje("Error en fila "+(f+1)+" columna "+(c+4)
                +" verifique el campo, recuerde que no debe estar vacio");
                return mapping.findForward(FAILURE);       
            }
            //BUSCAR INSTITUCION Y HACER SET
            DataBaseManager dbms = DataBaseManager.getInstance();
            
            Institucion inst =new Institucion();
            inst.setNombre(institution1);
            if(dbms.agregarInstitucion(inst)){
                List instituciones = dbms.consultarInstitucion(inst);
                if (instituciones.isEmpty()) {

                    uploadForm.setMensaje("Error en fila "+(f+1)+" columna "+
                            (c+3)+" la institucion"+institution1+" no existe,"
                            + " revise el archivo"+file);
                    return mapping.findForward(FAILURE);
                }
            }
            
            Cell status= sheet.getCell(c+4,f);
            String status1=verfCellString(uploadForm,status).toLowerCase();
            if (status1.equals("error"))
            {
                uploadForm.setMensaje("Error en fila "+(f+1)+" columna "+(c+5)
                    +" verifique el campo estatus, recuerde que no debe estar vacio");
                return mapping.findForward(FAILURE);
            }else{
              if(status1.equals("seleccionado")){      
                Cell fechaInscripcion= sheet.getCell(c+8,f);
                String fechaInscripcion1= verfCellDate(uploadForm,fechaInscripcion);
                if (fechaInscripcion1.equals("error"))
                {
                    uploadForm.setMensaje("Error en fila "+(f+1)+" columna "+(c+9)
                    +" verifique el campo, recuerde que no debe estar vacio");
                    return mapping.findForward(FAILURE);
                }

            Cell hora= sheet.getCell(c+9,f);  
            String hora1=verfCellString(uploadForm,hora);
            if (hora1.equals("error")){
                uploadForm.setMensaje("Error en fila "+(f+1)+" columna "+(c+10)
                +" verifique el campo, recuerde que no debe estar vacio");
                return mapping.findForward(FAILURE);       
            }
            
            Cell lugar= sheet.getCell(c+10,f);
            String lugar1=verfCellString(uploadForm,lugar);
            if (lugar1.equals("error")){
                uploadForm.setMensaje("Error en fila "+(f+1)+" columna "+(c+11)
                +" verifique el campo, recuerde que no debe estar vacio");
                return mapping.findForward(FAILURE);       
            }
            
            Cell sede= sheet.getCell(c+11,f);
            String sede1=verfCellString(uploadForm,sede);
            if (sede1.equals("error")){
                
                uploadForm.setMensaje("Error en fila "+(f+1)+" columna "+(c+12)
                +" verifique el campo, recuerde que no debe estar vacio");
                return mapping.findForward(FAILURE);       
            }
            //Si esta la inscripcion
             if((fechaInscripcion1.equals("vacio") || 
                     lugar1.equals("vacio") || sede1.equals("vacio")  || 
                     hora1.equals("vacio")) && 
                     !( fechaInscripcion1.equals("vacio") &&
                     lugar1.equals("vacio") && sede1.equals("vacio") &&
                     hora1.equals("vacio"))){
               mensaje = uploadForm.getMensaje().concat("Error en fila"
               + " "+(f+1)+" columna "+(c+8)+" Fecha Inscr: "+fechaInscripcion1+
                   " Hora: "+hora1+" lugar: "+lugar1+" sede: "+sede1);
               uploadForm.setMensaje(mensaje);
               return mapping.findForward(FAILURE);
             }
            
            
              }
              
            }

            Cell notaMatematica= sheet.getCell(c+5,f);
            int notaMatematica1=verfNumbLabel(uploadForm,notaMatematica);

            if(notaMatematica1==-1)
            {
                
                mensaje = uploadForm.getMensaje().concat("Error en fila "+(f+1)+" columna "+(c+6)
                +" verifique el campo, recuerde que solo puede "
                + "estar vacio si el estatus del preinscrito "
                + "es seleccionado"+paso);
                uploadForm.setMensaje(mensaje);
                return mapping.findForward(FAILURE);
            }
            paso=500;
            Cell notaVerbal= sheet.getCell(c+6,f);
            int notaVerbal1=verfNumbLabel(uploadForm,notaVerbal);
            if(notaVerbal1==-1)
            {
                mensaje = uploadForm.getMensaje().concat("Error en fila "+
                        (f+1)+" columna "+(c+7)
                    +" verifique el campo, recuerde que solo puede "
                    + "estar vacio si el estatus del preinscrito "
                    + "es seleccionado"+paso);
                uploadForm.setMensaje(mensaje);
                return mapping.findForward(FAILURE);

            }
            paso=700;
            Cell notaRaven= sheet.getCell(c+7,f);
            int notaRaven1=verfNumbLabel(uploadForm,notaRaven);
            if(notaRaven1==-1)
            {
                mensaje = uploadForm.getMensaje().concat("Error en fila"
                + " "+(f+1)+" columna "+(c+8)
                +" verifique el campo, recuerde que solo puede "
                + "estar vacio si el estatus del preinscrito "
                + "es seleccionado"+paso);
                uploadForm.setMensaje(mensaje);
                return mapping.findForward(FAILURE);
            }
            paso=800;
            if((notaVerbal1==-2 || notaMatematica1==-2 || notaRaven1==-2) &&
                    !( notaVerbal1==-2 && notaMatematica1==-2 && notaRaven1==-2)){
            mensaje = uploadForm.getMensaje().concat("Error en fila"
                + " "+(f+1)+" columna "+(c+8)+" Nota Verbal: "+notaVerbal1+
                    " Nota Matematica: "+notaMatematica1+" Nota Raven: "+notaRaven1);
                uploadForm.setMensaje(mensaje);
                return mapping.findForward(FAILURE);
            
            }
            paso=900;
            esSeleccionado=false;
            f++;
            }
            paso=4;
        uploadForm.setMensaje("(Filas, Columnas) Procesadas............. ("
                +(sheet.getRows()-1)+","+(sheet.getColumns()-1)
                +")\n");
            
        workbook.close(); 
            paso=5;
        uploadForm.setMensaje("");
        request.setAttribute("completado","cargar");
        request.setAttribute("pathfile",file);
        return mapping.findForward(SUCCESS);
            
        } else {
            return mapping.findForward(FAILURE);
        }
    }catch (Exception e) {
            mensaje = "Error: Archivo no soportado o Formato dentro "
                    + "de archivo Excel invalido";
            uploadForm.setMensaje(mensaje+e+paso);
            return mapping.findForward(FAILURE);
            
    }
            
     
    }
    public ActionForward page(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        return mapping.findForward("page");
    }

         private String getPath(ArchivoExcel uploadForm) throws IOException {
        String path = "";
        FileOutputStream outputStream = null;
        FormFile formFile = null;
        try {
            formFile = uploadForm.getPath();
            path = getServlet().getServletContext().getRealPath("") + "/"
                    + formFile.getFileName();
            outputStream = new FileOutputStream(new File(path));
            outputStream.write(formFile.getFileData());
        } catch (Exception e) {
            System.out.println(e);
            uploadForm.setMensaje("Error :: Revise el archivo que ha "
                    + "introducido.<BR> Recuerde que debe ser .xls");
            path = "";
            // Do Nothing
        } finally {
            if (outputStream != null) {
                outputStream.close();
            }
        }
        return path;
    }


    private String verfCi(ArchivoExcel uploadForm, Cell ci) throws IOException {

      int cedula1=0;
      try{
      if (ci.getType() == CellType.NUMBER)
      {
        NumberCell lc = (NumberCell) ci;
            if (!lc.getContents().isEmpty()){
                cedula1 = (int)lc.getValue();
                String cedula2=Integer.toString(cedula1).replaceAll(" ", "");
                if(cedula2.isEmpty())  return "error";
                else                   return cedula2;
                
            }else{
                return "error";
            }
      }else{
            if (ci.getType() == CellType.LABEL)
            {
                LabelCell lct = (LabelCell) ci;
                if (!lct.getContents().isEmpty())
                {
                    //Se eliminan espacios dentro de string cedula
                    String cedulaSinBlancos="";
                    cedulaSinBlancos= (String)lct.getString().replaceAll("[^0-9]","");
                    String cedula3=cedulaSinBlancos.replaceAll(" ", "");
                if(cedula3.isEmpty())  return "error";
                else 
                    return cedula3;
                }else{
                    return "error";
                }
            }else{
               return "error";
            }
      }
      }catch (Exception e) {
            
            uploadForm.setMensaje(""+e);
            return "error";
            
    }
    }
    private int verfNumbLabel(ArchivoExcel uploadForm, Cell dato) throws IOException {
    int valor=0;    
    
    try{
      
      CellType cellType=dato.getType();
      if (cellType == CellType.EMPTY){
            return -2;
      }
      if(dato.getContents().isEmpty()){
            return -2;
      }
      if (cellType == CellType.NUMBER)
      {
            NumberCell lc = (NumberCell) dato;
            if (!lc.getContents().isEmpty()){
                valor=(int)lc.getValue();
                if(valor<0){
                    uploadForm.setMensaje("Valor Negativo");
                    return -1;
                    }else return valor;

            }else{ 
                uploadForm.setMensaje("No es tipo numerico");
                return -1;
            }
      }else{
            if (cellType == CellType.NUMBER_FORMULA)
            {
                NumberCell lct = (NumberCell) dato;
                String numberString=lct.getNumberFormat().toString();
                if (!numberString.isEmpty())
                {
                    String numberString2=lct.getContents();
                    if(!numberString2.isEmpty())
                    {
                        valor=(int)lct.getValue();
                        if(valor<0){
                            uploadForm.setMensaje("Valor Negativo");
                            return -1;
                            }else return valor;
                    }
                    else{
                        uploadForm.setMensaje("Contenido  vacio");
                        return -2;
                    }
                }
                else{ 
                        uploadForm.setMensaje("Formato de formula vacio");
                        return -1;
                    }
            }else{
                if(cellType==CellType.FORMULA_ERROR){
                    uploadForm.setMensaje("Formula Erronea");
                    return -1;
                }else{
                    uploadForm.setMensaje("Tipo no es Number ni "
                            + "NumberFormula es "+cellType+" ");
                    return -1;
                }
            }
      }
      }catch (Exception e) {
            uploadForm.setMensaje(""+e);
            return -1;
      }
    }
    private String verfCellString(ArchivoExcel uploadForm,Cell cell)
            throws IOException {
        String dato="";
        try {
            if (cell.getType() == CellType.EMPTY){
            return "vacio";
            }
            if (cell.getType() == CellType.LABEL)
        {
            LabelCell lss = (LabelCell) cell;
             //OJO no cargar string con solo blancos
            dato=lss.getString().replaceAll(" ", "");
            if(!dato.isEmpty() )
                return lss.getString();    
            else return "error";
        }else{
            return "error";
        }
        }catch (Exception e) {
            
            uploadForm.setMensaje("Ocurrio Error en el Archivo (S)"+e);
            return "error";
            
    }
    }
    


 private String verfCellDate(ArchivoExcel uploadForm,Cell cell)
            throws IOException {
        String dato="";
        
        try {
            if(cell.getType()==CellType.EMPTY){
                return "vacio";
            }
       if (cell.getType() == CellType.DATE)
       {
              DateCell lf = (DateCell) cell;
              dato = lf.getContents().substring(0, 10).replaceAll(" ", "-");
              return dato;
       }else    return "error";
        }catch (Exception e) 
        {
            uploadForm.setMensaje(""+e);
            return "error";
        }
 }
       /**
     * Función que elimina acentos y caracteres especiales de
     * una cadena de texto.
     * @param input
     * @return cadena de texto limpia de acentos y caracteres especiales.
     */
    public static String remove(String input) {
        // Cadena de caracteres original a sustituir.
        String original = "áàäéèëíìïóòöúùuñÁÀÄÉÈËÍÌÏÓÒÖÚÙÜÑçÇ";
        // Cadena de caracteres ASCII que reemplazarán los originales.
        String ascii = "aaaeeeiiiooouuunAAAEEEIIIOOOUUUNcC";
        String output = input;
        for (int i=0; i<original.length(); i++) {
            // Reemplazamos los caracteres especiales.
            output = output.replace(original.charAt(i), ascii.charAt(i));
        }//for i
        return output;
    }//remove


}